package com.example.service.serviceImpl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.common.CaptureConfig;
import com.example.common.JwtTokenUtils;
import com.example.common.UserHolder;
import com.example.domain.entity.Account;
import com.example.domain.entity.Admin;
import com.example.domain.entity.Params;
import com.example.exception.CustomException;
import com.example.mapper.AdminMapper;
import com.example.service.AdminService;
import com.wf.captcha.utils.CaptchaUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Service
public class AdminServiceImpl implements AdminService {
    
//    @Resource
//    private AdminDao adminDao;

    @Resource
    private AdminMapper adminMapper;
    
    public List<Admin> findAll() {
        //todo return adminMapper.selectAll();
        return adminMapper.selectList(new QueryWrapper<Admin>());

    }
    
    public Page<Admin> findBySearch(Params params) {
        // 开启分页查询
        Page<Admin> page = new Page<>(params.getPageNum(), params.getPageSize());

        // 构建查询条件
        QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
        if (params != null) {
            if (params.getName() != null && !params.getName().isEmpty()) {
                queryWrapper.like("name", params.getName());
            }
            if (params.getPhone() != null && !params.getPhone().isEmpty()) {
                queryWrapper.like("phone", params.getPhone());
            }
        }
        // 按 id 倒序排序
        queryWrapper.orderByDesc("id");

        // 执行分页查询
        Page<Admin> adminPage = adminMapper.selectPage(page, queryWrapper);
        // 将 MyBatis-Plus 的 Page 转换为 PageInfo
        return adminPage;
    }
    
    public void add(Admin admin) {
        // 1. 用户名一定要有，否则不让新增（后面需要用户名登录）
        if (admin.getUsername() == null || "".equals(admin.getUsername())) {
            throw new CustomException("用户名不能为空");
        }
        // 2. 进行重复性判断，同一名字的管理员不允许重复新增：只要根据用户名去数据库查询一下就可以了
        Admin user = adminMapper.findByUserName(admin.getUsername());
        if (user != null) {
            // 说明已经有了，这里我们就要提示前台不允许新增了
            throw new CustomException("该用户名已存在，请更换用户名");
        }
        // 初始化一个密码
        if (admin.getPassword() == null) {
            admin.setPassword("123456");
        }
        admin.setRole("ADMIN");
        adminMapper.insert(admin);
    }
    
    public void update(Admin admin) {
        adminMapper.updateById(admin);
    }
    
    public void delete(Integer id) {
        adminMapper.deleteById(id);
    }
    
    public Account login(Account admin, String key, HttpServletRequest request) {
        // 判断验证码对不对
        if (!admin.getVerCode().toLowerCase().equals(CaptureConfig.CAPTURE_MAP.get(key))) {
            // 如果不相等，说明验证不通过
            CaptchaUtil.clear(request);
            throw new CustomException("验证码不正确");
        }
        CaptureConfig.CAPTURE_MAP.remove(key);
        
        // 1. 进行一些非空判断
        if (admin.getUsername() == null || "".equals(admin.getUsername())) {
            throw new CustomException("用户名不能为空");
        }
        if (admin.getPassword() == null || "".equals(admin.getPassword())) {
            throw new CustomException("密码不能为空");
        }
        // 2. 从数据库里面根据这个用户名和密码去查询对应的管理员信息，
        Admin user = adminMapper.findByNameAndPassword(admin.getUsername(), admin.getPassword());
        if (user == null) {
            // 如果查出来没有，那说明输入的用户名或者密码有误，提示用户，不允许登录
            throw new CustomException("用户名或密码输入错误");
        }
        // 如果查出来了有，那说明确实有这个管理员，而且输入的用户名和密码都对；
        // 生成该登录用户对应的token，然后跟着user一起返回到前台
        String tokenData = user.getId() + "-" + user.getRole();
        String token = JwtTokenUtils.genToken(tokenData, user.getPassword());
        user.setToken(token);
        return user;
    }
    
    public Admin findById(Integer id) {
        return adminMapper.selectById(id);
    }
    
    /**
     * 用户修改密码
     * @param account
     */
    public void updatePassword(Account account) {
        Admin admin = adminMapper.findByUserName(account.getUsername());
        if(ObjectUtil.isNull(admin)){
            throw new CustomException("用户不存在");
        }
        if(!account.getPassword().equals(admin.getPassword())){
            throw new CustomException("原密码不正确");
        }
        admin.setPassword(account.getNewPassword());
        adminMapper.updateById(admin);
        UserHolder.removeUser();
    }
    
    /**
     *修改个人信息
     * @param account
     */
    public void updatePersonal(Account account) {
        Admin admin = new Admin();
        BeanUtils.copyProperties(account,admin);
        update(admin);
    }

}
